
//    在多进程的服务程序中，如果子进程收到退出信号，子进程自行退出，如果父进程收到退出信号，应该
先向全部子进程发送退出信号，然后自己再退出。




#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<cstdlib>
using namespace std;

void FathEXIT(int sig);         //父进程的信号处理函数
void ChildEXIT(int sig);        //子进程的信号处理函数

int main(int argc, char *argv[])
{
    //忽略全部的信号，不希望被打扰。
    for(int ii =1; ii<=64; ii++)
        signal(ii, SIG_IGN);

    //设置信号，在shell状态下可用"kill + 进程号" 或 "Ctrl+c"正常终止这些进程
    //但请不要用"kill -9 + 进程号" 强行终止
    signal(SIGTERM, FathEXIT);          //值为15
    signal(SIGINT, FathEXIT);           //值为2

    while(true)
    {
        if(fork() > 0)  //父进程流程
        {
            sleep(5);
            continue;           //父进程每五秒创造一个子进程
        }
        else            //子进程流程
        {
            //子进程需要重新设置信号
            signal(SIGTERM, ChildEXIT);         //子进程的退出函数与父进程不一样
            signal(SIGINT, SIG_IGN);            //子进程不需要捕获SIGINT信号

            while(true)
            {
                cout << "子进程" << getpid() << "正在运行中。" << endl;
                sleep(3);
                continue;
            }
        }
    }
    return 0;
}



//父进程信号处理函数
void FathEXIT(int sig)
{
    //防止信号处理函数在执行的过程中再次被信号中断
    signal(SIGINT, SIG_IGN);
    signal(SIGTERM, SIG_IGN);

    cout << "父进程退出，sig = " << sig << endl;

    kill(0, SIGTERM);           //发送15信号，通知全部(包括自己)的子进程退出

    //此处增加释放资源的代码

    exit(0);
}


//子进程信号处理函数
void ChildEXIT(int sig)
{
    //防止信号处理函数在执行过程中再次被信号中断
    signal(SIGINT, SIG_IGN);
    signal(SIGTERM, SIG_IGN);

    cout << "子进程" << getpid() << "退出, sig = " << sig << endl;

    //此处增加释放资源代码(只释放子进程的资源)

    exit(0);
}


